A partial Output Device Transform (PODT) maps from OCES to linear display RGB
(both of these are optical in nature).
The adjective "partial" is used because this
is an ODT that omits the final OETF (which maps from linear display RGB to signal display RGB).
This PODT is parameterized.
general.PODT( display_pri, Ymax=1, observerWP=NULL, surround='dark', limiting_pri=NULL )
general.PODT()
returns a TransferFunction
of dimension 3
that maps OCES RGB to linear display RGB.
The domain is [0,10000]\(^3\) and the range is [0,1]\(^3\).
The metadata
contains the display primaries and whitepoint,
which is useful in installRGB()
.
a 4x2 matrix containing the display primaries, or a numeric vector of length 8
that can be converted to such a matrix, by row.
Some built-in matrices are REC709_PRI
, etc.
display_pri
can also be NULL
, which means that the PODT maps to XYZ, instead of RGB.
This is used in the case of DCDM (Digital Cinema Distribution Master).
See the User Guide Appendix for examples of this.
display_pri
is stored in the metadata of the returned object and later used
in installRGB()
(if the PODT is passed in an argument).
the maximum luminance of the output device, in \(cd/m^2\) (or nits).
This has no effect on the PODT itself.
It is stored in the metadata and later used
in installRGB()
(if the PODT is passed in an argument) when computing the
3x3 matrix that transforms from display RGB to display XYZ.
the xy chromaticity of the assumed observer whitepoint.
This is used to make a Chromatic Adaptation Transform (CAT) from the ACES whitepoint (approximately D60)
to the assumed observer whitepoint.
If observerWP
is NULL
, it is taken from display_pri
.
If display_pri
is NULL
, then it is taken from limiting_pri
.
If limiting_pri
is NULL
, or if two whitepoints are the same, then there is no CAT.
The level of the surround luminance.
Valid values are 'dark'
and 'dim'
.
If the level is 'dark'
there is no special color compensation.
Partial matching is enabled and matching is case-insensitive.
a 4x2 matrix containing the limiting primaries, or a numeric vector of length 8
that can be converted to such a matrix, by row.
If limiting_pri
is not NULL
, and not equal to display_pri
,
then the output RGB is clamped to the RGB cube that corresponds to limiting_pri
.
The transfer is complicated; here is a summary of the steps:
matrix conversion from AP0 RGB → AP1 RGB
clamp to non-negative RGB
segmented spline, assuming CINEMA_WHITE
=48 nit
absolute luminance to linear code-value, in cube [0,1]\(^3\)
scale and roll-white to avoid clipping (optional, only when observerWP
is ACES whitepoint and display whitepoint is D65 or DCI whitepoint)
dim surround compensation with conversion to XYZ and back again (optional, see argument surround
)
matrix conversion from AP1 RGB to XYZ
adapt XYZ from ACES whitepoint to observer whitepoint (optional, see argument observerWP
)
clamp XYZ to limiting primaries (optional, see argument limiting_pri
)
matrix conversion from XYZ to linear display RGB (but not for DCDM, see argument display_pri
)
clamp linear display RGB (or XYZ for DCDM) to the cube [0,1]\(^3\)
ST 2065-1:2012. SMPTE Standard - Academy Color Encoding Specification (ACES). 2013.
TransferFunction
,
installRGB()
,
metadata()
,
RRT.TF
,
Standard Primaries